import br.edu.ufam.controleAcesso.*;

class SecurityFilters {
    def filters = {
           loginCheck(controller:'*', action:'*') {
               before = {
                      //Verifica se não tem usuário na sessão
                  if(!session.usuario) {
                      if (controllerName + "/" + actionName == "home/login" || 
                          controllerName + "/" + actionName == "home/loginValida" || 
                          controllerName + "/" + actionName == "home/logout" || 
                          controllerName + "/" + actionName == "home/migrarUUID" || controllerName == null) {
                          //Libera para logar
                          return true
                      }
                      //Se não tem usuário na sessão então redireciona para a página de login
                      flash.errors = "Sessão expirada! Efetue seu login novamente."
                      redirect(uri:'/home/login')
                      return false
                  }
                  else {

                      //Seleciona aplicacoes do usuário
                      def aplicacoes = Aplicacao.findAll("from Aplicacao a where a.ativo is true and a.dtinicio <= ? and a.dtfim >= ? and (a.id in (select ga.aplicacao.id from GrupoAplicacao ga where ga.grupo.id = ?) or a.id in (select ua.aplicacao.id from UsuarioAplicacao ua where ua.usuario.id = ?)) order by a.menu.descricao, a.descricao",[new Date(), new Date(), Usuario.get(session.usuario).grupo.id, session.usuario])
                      //guarda na sessao os menus do usuário
                      session.aplicacoes = aplicacoes

                      if(controllerName == null){
                          redirect(uri:'/home/index')
                          return false
                      }
                      if (controllerName + "/" + actionName == "home/index" || 
                          controllerName + "/" + actionName == "home/login" || 
                          controllerName + "/" + actionName == "home/loginValida" || 
                          controllerName + "/" + actionName == "home/logout" || 
                          controllerName + "/" + actionName == "home/alterarSenha" || 
                          controllerName + "/" + actionName == "home/alterarSenhaAtualiza" ) {                          
                          //Libera para logar
                          return true
                      }
                      //Pega as aplicacoes do usuario
                      //def aplicacoes = Aplicacao.executeQuery("select a from Aplicacao a where a.ativo is true and a.inicio <= ? and a.fim >= ? " +
                      //                                        "and a in (select ga.aplicacao from GrupoAplicacao ga where ga.grupo = ?))",new Date(),new Date(),session.usuario,session.usuario?.grupo)  or (select ua.aplicacao.id from UsuarioAplicacao ua where ua.usuario.id = ?)
                      def aplicacao = Aplicacao.findAll("from Aplicacao a where a.controle = ? and a.ativo is true and a.dtinicio <= ? and a.dtfim >= ? and (a.id in (select ga.aplicacao.id from GrupoAplicacao ga where ga.grupo.id = ?) or a.id in (select ua.aplicacao.id from UsuarioAplicacao ua where ua.usuario.id = ?)) order by a.descricao",[controllerName, new Date(), new Date(), Usuario.get(session.usuario).grupo.id, session.usuario])
                      
                      if (!aplicacao.isEmpty()) {
                          return true
                      }
                      else {
                          redirect(uri:'/home/index')
                          return false
                      }
                  }
               }
           }
    }
}